【硬件算法笔记18】浮点运算器设计

您所在的位置:网站首页 ibm power6 【硬件算法笔记18】浮点运算器设计

【硬件算法笔记18】浮点运算器设计

#【硬件算法笔记18】浮点运算器设计| 来源: 网络整理| 查看: 265

基于这本书:

本章讨论加减乘除四种基本浮点运算,以及FMA的硬件实现。有关平方根,推迟至Section 21.6。本章的大部分讨论将涉及指数的处理、有效值的对齐、结果的标准化与舍入。至于定点有符号数运算的相关内容,则在前面的章节中早就讨论了。

浮点数加减运算器

浮点数的加减运算器结构如下图,浮点加减法的运算过程请见上一章。我们将在本章前三节中详细讨论该电路的组成,然后会介绍浮点乘除运算器以及FMA运算器。

如上图Fig 18.1,送入浮点加法器的两个操作数首先被拆包(unpacking),拆包过程包括:

分离每个操作数的符号、指数、有效值,并在拆包结果中恢复隐藏的 1(hidden 1)将操作数转为运算器的内部各式(如果格式不同,如单精度拓展或双精度拓展)检测特殊的操作数和异常(如,识别非数字输入(NaN),诺识别到则应绕过加法器)

在讨论浮点算术时,我们会忽略次标准数(subnormals)。而且实际上,硬件上在处理次标准方面的困难,已经导致了我们对软件解决方案的依赖,以及随之而来的性能损失。有关支持次标准的浮点算法可以在别处找到[Schw03]。

节约硬件开销的小技巧

两指数的差值用于确定右移的距离,以及应该对哪个操作数右移。为节省硬件,我们通常只会为两操作数中的一个提供预移位(preshifting)功能,诺需要移位另一个操作数,则交换操作数。

在结果的标准化(post normalization)步骤中,浮点加减算出的和或差可能需要左移位,因此通常我们会保留右移时被丢弃的几位操作数,并在计算加法时考虑它们。于是,有效值加法器的位宽通常会大于输入有效值的位宽。Section 18.3有更多相关介绍。

类似地,也可以只为两操作数中的一个提供补码器(通常是不带预移位器的那个,以缩短电路关键路径)。对于此,诺 x 输入是负的,且只有(为正的) y 有补码器,则我们可以对 y 求补,于是将计算 x-y。最后我们再翻转结果的符号,而得到想要的结果 -(x-y) = y-x 。

标准化与舍入

IEEE的IEEE 754-2008标准规定,在浮点数格式中,对齐后的有效值之和或差必须处在区间 [0,4) 上。然后,如果这个结果在在 [2,4) 上,就说明它太大,必须将其右移 1 位(同时调整指数)以将其标准化;如果这个结果在 [0,1),则说明它太小,对于这种情况,可能需要左移多位(同时调整指数)以标准化结果。

需要注意的是,绝对值小于 1 的,正(或负)的 2的补码数 (x_1x_0.x_{-1}x_{-2}\dots)_{2's-compl} ,其高位将从 2 或更多个 0 或 1 开始。因此,所需的左移次数将由一个叫“前导 0/1 计数器(leading 0/1 counter)”的电路决定。或者,使用一个稍微复杂点的电路,在加法过程中就预测前导的 0 或 1 的数目,而缩短关键路径(详细见Section 18.2)。

结果的舍入也可能需要进行标准化移位和指数调整。为提高速度,我们可以预先计算出调整后的指数值,并在标准化结果已知时就选择合适的值。为获得合适的(和或差的)舍入结果,二进制浮点加法器必须在 ulp 外另加提供至少 3 个额外位,这些位被称作保护位(guard bit),舍入位(round bit)和黏着位(sticky bit)。至于这些位的作用,及其硬件实现,会在Section 18.3中讨论。

在大多所有情况下,有效数加法器(significand adder)都会被实现为一个对数时间的 1或2的补码 的加法器,通常采用超前进位设计。当结果有效数为负时,需要对其求补,才能得到对应的有符号数输出。通常 2的补码 可以由 1的补码 加上一个 ulp 生成,可以把 +ulp 这步合并到加法操作(加法器的最低位进位输入)中,但这可能导致需要舍入。因此,0, ulp, 2ulp将被在舍入过程中被加到有效数加法器的真实输出(或补码后的输出)上。

于是,对浮点加减法结果进行打包(packing)的过程将包括:

将结果的符号、指数、有效数组合起来,并删去隐藏的 1。对特殊值和异常进行测试(如 0结果、上下溢出)

需要注意的是,与拆包过程不同,内部和外部格式间的转换并不被包括在打包过程中。因为高位宽有效数转低位宽有效数需要舍入,而这步舍入最好在舍入阶段(rounding stage)内完成,其将产生满足期望精度的结果。

不同处理器的浮点加法器实现在细节上可能与Fig 18.1所示的通用设计不同。但基本原则是相同的,而在具体实现上,可能会利用重叠或合并等加速子运算的聪明方案来改进速度,或节约硬件成本。Section 18.2和18.3会介绍其中的一些技术。

预移位(preshifting)和后移位(postshifting)

预移位总是为向右移相当于两指数差的位数。需要注意的是,对于IEEE 754-2008短格式(short format),两指数之差可以大到 127-(-126)=253,然而,即便在加法过程中提功力额外的精度,操作数和结果也会比253位短得多。这使得我们允许简化和加速Fig 18.1中的指数减法器和预移位逻辑。

移位器设计

例如,假如加法器是 32bits 的,则任何移位距离大于32位的预移位结果都将为 0。因此,我们只需要考虑指数差的最低 5 位,而差大等于 32 时,直接令预移位结果为 0 即可。

现在让我们继续假设 0 到 31 位的右移必须实现。原则上,这可以通过一组 32-to-1 的 MUX 实现,如图Fig 18.2,诺我们要对 x 进行移位,移位结果为 y ,则可为每个 y_i 配置一个这样的 MUX,而实现移位选择,但显然这会导致扇入扇出问题。

通常,多级的设计可以用来缓解扇入扇出问题。图Fig 18.3展示了一个组合移位器的一部分,它可以将输入移位0到15位间的任意移位距离。每个节点都是一个 2-to-1 的MUX,然后每层MUX以扇形的方式向下一级的两个节点输入。这四层,每层分别实现了移位1、2、4、8位的功能,通过选择每层是否移位,组合地,可以实现0到15位间的任意移位距离。

实践中采用的设计通常介于Fig 18.3和18.2两设计之间。例如,我们可以将Fig 18.3的每两层合并为一层。

需要注意的是 e1-e2 可能为负,因此指数差值的符号决定了我们要对哪个操作数进行移位,然后差值的绝对值则表示移位量。获得负差值情况下的移位量 |e1-e2| 的一种方法是对齐求补,但由于进位传递,这或带来额外延迟。另一种方法是使用ROM或PLA来实现查表,接受指数差值输入,输出移位量。第三种办法是分别计算 e1-e2,e2-e1 ,然后从中选择为正的一个座位移位量,考虑到指数位宽通常不大,指数减法不会有太大成本。

后移位与预移位类似,但区别在于,它应该能同时实现0~1位的右移与0~31位的左移,对预移位的相关实现稍作调整,就能得到用于后移位的移位器。

对于IEEE 754-2008操作数,其标准化过程中的右移 1 位可能大于加法器的输出范围。假设加法器的输出是一个区间 (-4,4) 上的 2的补码,其形式为 z=(c_{out}z_1z_0.z_{-1}z_{-2}\dots)_{2's-compl} 。则是否与要执行右移的条件的条件很容易确定:诺 c_{out}\ne z_1 ,则需要右移;反之诺 c_{out}=z_1 ,则标准化不需要右移动,并且标准化所需的左移量与 z_1 相同的连续前导位数量决定(即,诺 z_1=0 (或 z_1=1 ),则需要从 z_0 开始检测有多少个连续的 0 (或1))。

如Section 18.1所述,我们可以通过所谓的前导位计数器来完成这个检测,或者在计算加法过程进行时,就预测相同前导位数目,以缩短关键路径。两种方案如下图Fig 18.4所示:

普通的前导 0/1 计数器非常简单,留做练习。

连续0/1前导位预测

关于连续前导 0/1 的预测,注意当浮点加法器输入被标准化时,当且仅操作数符号(有效数加法器的输入)不同时,才需要对操作数进行标准化左移。未标准化输入的前导 0/1 测试有点麻烦,但在概念是也不难。

记有效数加法器的输入分别为一个 正的2的补码数 (0x_0.x_{-1}x_{-2}\dots)_{2's-compl} 和一个 负的2的补码数 (1y_0.y_{-1}y_{-2}\dots)_{2's-compl} ,并假设在家发过程中,我们精确地从第 0 位开始,精确地生成并传递进位到第 i 位,借用Section 5.6的进位生成(generate)、传递(propagate)、截断(annihilate),可以得到:

g_{-i}=1 时,令 j 为满足下条件的最小索引值:

于是我们将有 j 或 j-1 个前导 0,分别取决于第 j 位出现的进位(carry emerging)是 0 还是 1。

a_{-i}=1 时,令 j 位满足下条件的最小索引值:

于是我们将有 j-1 或 j 个前导 1,分别取决于第 j 位的进位输出(carry-out)是 0 还是 1。

预测前导 0/1 数量所需的 g, p, a 和进位信号可以从有效数加法器中得到(以节省硬件)。根据前讨论,预测前导 0/1 数量所需的电路设计可以分为两级,第一级类似于一个超前进位电路,在第 j 位生成一个 1,并在其左边的其它位生成 0(可以将此表述为一种并行前缀计算,因为实际上我们感兴趣的是检测四种模式之一:pp···ppgaa···aag,pp···ppgaa···aap,pp···ppagg···gga,pp···ppagg···ggp)。然后第二级是一个编码器或优先编码器(取决于第一级的设计),而产生前导 1 的索引。

最后,在前面的讨论中,我们假设了,硬件的预处理和后处理是分开的,对于高速或流水线设计,通常如此。但诺要为了节约硬件成本而将两部分合并,则合并的结构必须能够支持所有的左右移功能,可以简单修改Fig 18.3以得到一个双向版本的移位器。

舍入与异常

在对齐步骤中,预移位移出的位不应被全部丢弃,因为它们可以影响精度(结果的舍入)。回想一下,IEEE的要求是浮点加减的结果必须与无限精度执行计算所得的结果相匹配。因此,我们必须在计算中保留移出的所有位,保持移出的所有位将导致有效数加法器的位宽翻倍。

前面提过,有效数加法器必须在左边加宽1bit,以容纳2的补码输入的符号位。而结果表明,仅需在加法器右边加宽 3bits 就能容纳足以合适的舍入结果。我们把右边增加的这三个额外位分别叫做 G, R, S ,于是,有效数加法器的输出可以表示为:

上式中, z1 是符号指示位, c_{out} 为有效数上溢位,而右边多出的三位分别为:

G:保护位(guard bit)R:舍入位(round bit)S:黏着位(sticky bit)

现在来解释它们的作用,以及为什么有了它们舍入就足够了。解释是基于 IEEE 754-2008 二进制浮点格式讨论的,但对其它情况也是有效的:

右移1位对齐执行时,G 可以把被移除的位保留住,而避免精度损失(顾名“保护”位)。对于大等于 2 位的对齐移位,移位后的有效数将在区间 [0,1/2) 上,而未移位的有效数在 [1,2) 上,于是两者差值在 [1/2,2) 上。因此,在后一种情况,至多只需要左移移 1 位就能完成标准化,于是 G 仍然可以保证避免精度损失。

在标准化左移发生时,“舍入位”R 可用于确定四舍五入是导致结果有效数变小(R=0,丢弃部分小于 ulp/2),还是变大(R=1,丢弃部分大等于 ulp/2)。

除此之外,在一些舍入方案中可能需要确定丢弃部分是否严格等于 ulp/2,“黏着位”S 可以提供这个信息,其被设置为所有移位时经过它的位的逻辑或。例如,对齐右移 7bits 意味着黏着位将被被设置为所有经过了 G 和 R 的 5bits 的逻辑或,这种重复的或操作可以在预移位器中顺便实现完成(想想是如何实现的?)。

有效数加法器输出的最低几位,经1bit标准化移位后的影响如下所示:

其中 Z_h 是标准化后的结果第 h 位的数位。其中在标准化右移过程中,黏着位 S 新值是其旧值与 R 的或逻辑结果。

要基于此获得为正的标准化结果 Z,我们可以将其舍入到最近值,只需要去掉多余的3位并:

另外要注意的是,标准化左移了多位的情况下是不需要是四舍五入的,因为其精度是完全保持的(黏着位为0)。至于其它的舍入,如舍入到最近偶数,也可以以此类推实现。

异常检测

上下溢异常可以很容易的通过Fig 18.1底部附近的指数加法器来检测。只有标准化右移发生时,上溢才可能发生;而下溢则仅在标准化左移时可能发生。涉及 NaN 和无效操作的异常可以由Fig 18.1中的“unpacking”和“packing”模块处理。剩下的就是检测结果是否为零,以及将结果编码为全零,零结果检测器本质上是前面讨论的前导 0/1 检测器的副产物。至于“不精确(inexact)”异常的检测,作为练习留给读者。

正如前面所讨论的,2或更多位的预移位排除了需要多位后移位以除去前面连续的0/1的可能性。高速的浮点加法器设计可以在双路径(dual-path)的安排中利用这点。

如上图Fig 18.5。当指数差不超过1时(即输入数的数量级接近),有效数将被转发到近路径(Near path)上,该路径包含一个 连续全导 0/1 预测期与一个完整的后移位器。实际上,在这个路径中甚至可以完全避免舍入。

否则,也就是说对于大等于2位的预移,远路径(far path)将包含一个完整的预移位其,还有一个简单版本的后移位器。需要注意的是,1位的标准化右移可能需要与舍入相结合。

采用此方案的现代处理器的相关描述可以参考[Nain01]。

浮点乘除运算器

浮点乘法器主要由一用于处理有效数乘法的个定点乘法器组成,外加用于处理指数和特殊值(±0、±∞、NaN、次标准)的电路。图Fig 18.6展示了浮点乘法器的一般结构。其中拆包(unpack)模块的作用与前面浮点加法器中的完全一样,类似地后面的打包(pack)模块也是。乘积符号由两操作数符号的异或活动。

我们可以计算两带偏差(biased)的指数之和,并从中减去偏差,以计算出暂定指数(tentative exponent)。对于IEEE754-2008短格式(short format),减127偏差可以很容易地完成,方法是先给指数加1,再减去128。

有效数乘法是上图中最慢也是最复杂的部分。对于IEEE 754-2008二进制格式,两个在区间 [1,2) 上的无符号有效数的乘积将落在 [1,4) 上。因此,我们可能需要将结果右移1位(同时调整指数)以完成标准化。而结果舍入后可能需要再进行一次标准化移位与指数调整。

当每个有效数都带有一个隐藏的1和小数时,有效数乘法器将是一个无符号的 (l+1)\times(l+1) 乘法器,并通常产生一个 (2l+2) 位的乘积。由于这个乘积必须在输出处舍入到 l+1 位,因此在乘法器设计中,我们可以忽略这个表示范围外有关的计算。实际上,只需要保留一个额外的舍入位和黏着位,就可以对最终结果进行适当的舍入,这里不需要保护位(为什么呢?)。

提高速度的小技巧

为提高速度,可以预先计算增加后的指数,并在标准化移位后立即选择正确的指数。有效数乘法是浮点乘法器中最复杂的部分,因此在乘法进行时,有足够的时间来进行指数与计算。

此外,舍入也不必被单独分为最后一步,通过合理的设计,可以将大部分舍入过程融入到乘法器中。注意到大多数乘法器产生的乘积的低半段是先于其它位产生的。所以,在乘法循环中,要用于舍入的位会被先产生。不过,标准化右移必须在结束或者快结束的时候才能执行。但标准化右移只有两种情况(没有后移位或者右移1位),因此我们可以设计一个逐步舍入的方案,分别计算两种舍入后的乘积,并在最后从中选择答案。或者,也可以在乘法过程中引入纠正项以将舍入转为截断[Even00]。

浮点乘法是由几个子计算或者连续的截断组成的,因此我们可以很自然地选择用流水线增加吞吐量。可以在Fig 18.6中每个方块间插入Latch,甚至在模块内部(例如如果乘法器是全树或者部分树的)内插入。25章会讨论流水化有关的注意事项与设计。

浮点除法器

浮点除法器与浮点乘法器大体上是一样的(Fig 18.6)。且同样,浮点除法器中的有效数除法器也是Fig 18.6中最慢、复杂的部分。前面有关浮点乘法器的技巧基本上也适用于浮点除法器。

浮点除法器与浮点乘法器的一个主要区别在于舍入。有效除法器的输出可能需要左移1位以标准化,而商则必须提供额外2位分别作为保护位和舍入位。在会产生余数的除法器中,最后的余数还用于导出黏着位(如何导出?),然后,再应用Section 18.3末尾介绍的舍入过程。

收敛除法算法由于没有余数,在舍入过程中会存在一些困难。

同样如定点乘除混合运算器,浮点乘法器和除法器也是可以混合的。尤其是,当其中除法是基于乘法(16章介绍的算法)时,将浮点乘法器改造成乘除混合单元所需的额外硬件很少。

FMA器

FMA器即 p=ax+b 的硬件实现。FMA常见于多项式迭代与向量点积计算中。基于Horner规则(Horner's rure)的多项式迭代的迭代方程为:

其中 c^{(j)} 为多项式 f(z)=c^{(n-1)}z^{n-1}+c^{(n-2)}z^{n-2}+\dots+c^{(1)}z+c^{(0)} 的系数,以及令 s 初始化为0。类似地,n维的向量v和u的点积可以写为:

同样,s从0开始。

实现FMA的最简单方法就是把在乘法器后面接一个加法器。但我们可以选择更好的合并实现,以优化FMA的延迟。

如上,我们可以用CSA来处理FMA中乘积ax与b的加法,而减少进位传播。

在浮点加法中,我们通常仅移位指数较小的操作数。但对于Fig 18.7这样的设计,我们总是给有效数 b 移 s_b 位。当b大于ax时,它必须预左移位已对齐。预移位后的 s_b 将是一个三倍位宽的数(triple-width number),以保留任何方向移出的位。

Fig 18.7的最终设计延迟基本上与浮点乘法器相当,无论是单阶段版本还是双截断流水化版本。因此,在浮点运算单一中合并单独的浮点加法器与浮点乘法器,转而使用FMA代替他们是相当可行的(设x=1即可实现加法,设b=0即可实现乘法)。

对数算术单元(logarithmic arithmetic unit)

如Section 17.6所讨论的,对数表示的乘除法很简单,因为这些运算可以转换为对数的加减法。本节中,我们将演示对数加减所需的算法与硬件,并提供一个完整的对数算术单元设计。

在Section 17.6中提过,对数的加减在原则上是可以通过LUT来实现的。减少LUT尺寸的一种办法是将感兴趣的二元运算(二进制)转换为对LUT大小要求更低的医院运算。

考虑 x>y>0 (其它情况也类似)的对数加减计算:

于是:

注意 x 是已知的,而 log(y/x) 则可通过更简单的 \Delta=-(\log x-\log y) 计算,给定Δ,则有:

上式可通过查表轻松计算(通过 \phi^+ 和 \phi^- 两个表)。因此,我们可以基于下两式计算对数加减:

Fig 18.8展示了一个完整的对数算数单元。对于加减法,需要比较以确定 Lx,Ly 谁更大,得到的比较信息将被送入控制器,减法过程会用到这个信息。读者可以自己补充相关细节。

对于上图设计,我们也可以使用比例因子来缩放其中的所有值到0,1之间。如果缩放了,则在对数计算的过程中,比例因子m(或带偏移的 Lm )的对数必须在乘法中减去。

参考文献

[Ande67] Anderson, S. F., J. G. Earle, R. E. Goldschmidt, and D. M. Powers, “The IBMSystem/360 Model 91: Floating-Point Execution Unit,”IBM J. Research andDevelopment, Vol. 11, No. 1, pp. 34–53, 1967.

[Arno05] Arnold, M. G., “The Residue Logarithmic Number System: Theory andImplementation,”Proc. 17th Symp. Computer Arithmetic, pp. 196–205, 2005.

[Bose87] Bose, B. K., L. Pei, G. S. Taylor, and D. A. Patterson, “Fast Multiply and Divide for aVLSI Floating-Point Unit,”Proc. 8th Symp. Computer Arithmetic, pp. 87–94, 1987.

[Cole08] Coleman, J. N., et al., “The European Logarithmic Microprocessor,”IEEE Trans.Computers, Vol. 57, No. 4, pp. 532–546, 2008.

[Coon80] Coonen, J. T., “An Implementation Guide to a Proposed Standard for Floating-PointArithmetic,”IEEE Computer, Vol. 13, No. 1, pp. 69–79, 1980.

[Davi74] Davis, R. L., “Uniform Shift Networks,”IEEE Computer, Vol. 7, No. 9, pp. 60–71,1974.

[Erce92] Ercegovac, M. D., and T. Lang, “On-the-Fly Rounding,”IEEE Trans. Computers,Vol. 41, No. 12, pp. 1497–1503, 1992.

[Even00] Even, G., and P.-M. Seidel, “A Comparison of Three Rounding Algorithms for IEEEFloating-Point Multiplication,”IEEE Trans. Computers, Vol. 49, No. 7, pp. 638–650,2000.

[Gok07] Gok, M., “A Novel IEEE Rounding Algorithm for High-Speed Floating-PointMultipliers,”Integration, the VLSI Journal, Vol. 40, No. 4, pp. 549–560, 2007.

[Gosl71] Gosling, J. B., “Design of Large High-Speed Floating-Point Arithmetic Units,”Proc.IEE, Vol. 118, pp. 493–498, 1971.

[Le07]Le, H. Q., et al., “IBM POWER6 Microarchitecture,”IBM J. Research &Development, Vol. 51, No. 6, pp. 639–662, 2007.

[Mont90] Montoye, R. K., E. Hokonek, and S. L. Runyan, “Design of the Floating-PointExecution Unit in the IBM RISC System/6000,”IBM J. Research and Development,Vol. 34, No. 1, pp. 59–70, 1990.

[Nain01] Naini, A., A. Dhablania, W. James, and D. Das Sarma, “1-GHz HAL SPARC64 DualFloating Point Unit with RAS Features,”Proc. 15th Symp. Computer Arithmetic,pp. 173–183, 2001.

[Ober97] Oberman, S. F., and M. J. Flynn, “Design Issues in Division and Other Floating-PointOperations,”IEEE Trans. Computers, Vol. 46, No. 2, pp. 154–161, 1997.

[Omon94] Omondi, A. R.,Computer Arithmetic Systems: Algorithms, Architecture andImplementation, Prentice-Hall, 1994.

[Schw03] Schwarz, E. M., M. Schmookler, and S. D. Trong, “Hardware Implementations ofDenormalized Numbers,”Proc. 16th IEEE Symp. Computer Arithmetic, June 2003,pp. 70–78.

[Schw06] Schwarz, E. M., “Binary Floating-Point Unit Design: The Fused Multiply-AddDataflow,” inHigh-Performance Energy-Efficient Microprocessor Design,V.G.Oklobdzija and R. K. Krishnamurthy (eds.), pp. 189–208, Springer, 2006.

[Sode96] Soderquist, P., and M. Leeser, “Area and Performance Tradeoffs in Floating-PointDivide and Square-Root Implementations,”ACM Computing Surveys, Vol. 28, No. 3,pp. 518–564, 1996.

[Tron07] Trong, S. D., M. S. Schmookler, E. M. Schwarz, and M. Kroener, “P6 BinaryFloating-Point Unit,”Proc. 18th Symp. Computer Arithmetic, pp. 77–86, 2007.

[Wase82] Waser, S., and M. J. Flynn,Introduction to Arithmetic for Digital Systems Designers,Holt, Rinehart, & Winston, 1982.

[Yu06]Yu, X. Y., et al., “A 5 GHz+ 128-bit Binary Floating-Point Adder for the POWER6Processor,”Proc. 32nd European Solid-State Circuits Conf., pp. 166–169, 2006.



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3